/*
 * 文 件 名:  ProductServiceProvider.java
 * 创建日期:  2012-9-17
 * 版    权:  Epro Technologies Co., Ltd. Copyright 2011-2012,  All rights reserved
 * 作    者:  hjd008
 */
package com.weipu.common.facade;

import java.util.ArrayList;
import java.util.Map;

import com.weipu.common.facade.exception.DxException;
import com.weipu.common.facade.model.AllCatelogModel;
import com.weipu.common.facade.model.CatelogModel;
import com.weipu.common.facade.model.CustomerPhotosModel;
import com.weipu.common.facade.model.ProductModel;
import com.weipu.common.facade.model.ProductResultModel;
import com.weipu.common.facade.model.ReviewlistModel;
import com.weipu.common.facade.model.SalesLimitModel;
import com.weipu.common.facade.model.SearchModel;

/**
 * 商品服务提供者;主要是提供对UI层接口，包括商品的所有与后台交互数据的接口，由管理台提供接口
 * 
 * @version [版本号, 2012-9-29]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 * 
 * @author hjd008
 */
public interface ProductServiceProvider
{
    
    /**
     * 
     *  获取顶级目录
     * 
     * @return [参数说明]
     * @return String [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    ArrayList<CatelogModel> getTopCategories(long customerID,boolean isFilter,String categoryIds)
        throws DxException;
    
    /**
     * 
                   *  获取顶级目录
     * @param isLoadFromCache 是否优先从缓存中读取 
     * @return [参数说明]
     * @return String [返回类型说明]
     * @throws DxException 
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    ArrayList<CatelogModel> getTopCategories(boolean isLoadFromCache,long customerID,boolean isFilter,String categoryIds)
        throws DxException;
    
    /**
     * 
     *  获取某个类别下的所有子类别
     * 
     * @return [参数说明]
     * @return String [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    ArrayList<AllCatelogModel> getAllChildCategories(int categoryId)
        throws DxException;
    
    /**
     * 获取父目录下所有的目录列表[参数说明]
     * @param categoryId 目录ID 
     * @param isLoadFromCache 是否从缓存读取
     * @return categoryId [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    ArrayList<AllCatelogModel> getAllChildCategories(int categoryId, boolean isLoadFromCache)
        throws DxException;
    
    /**
     * 
     *  获取指定目录下的一级子目录
     * 
     * @return [参数说明]
     * @return String [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    ArrayList<CatelogModel> GetChildCategories(int categoryId)
        throws DxException;
    
    /**
     * 
     *  获取指定目录下的一级子目录
     * @param categoryId 目录ID
     * @param isLoadFromCache 是否从缓存中加载
     * @return [参数说明]
     * @return String [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    ArrayList<CatelogModel> GetChildCategories(int categoryId, boolean isLoadFromCache)
        throws DxException;
    
    /**
      * 根据关键字获取搜索产品的列表   次接口为搜索引擎商品
      * @param keyName  搜索的关键字
      * @param currentEndIndex 上次查询在搜索引擎中标记的位置（开始则为0）
      * @param pageCount 每页条数
      * @param orderByField sort 排序 ：次接口排序需特殊处理：
      * @param startPrice 起始价格
      * @param endPrice 结束价格
      * @param beginStar 评分等级
      * @return
      * @throws DxException  [参数说明]
      * @return SearchModel [返回类型说明]
      * @exception throws [违例类型] [违例说明]
      * @see [类、类#方法、类#成员]
      */
    SearchModel getSearchProductList(String keyName, int currentEndIndex, int pageCount, String orderByField,
        double startPrice, double endPrice, double beginStar,String currencyCode,long customerID,boolean isFilter,String categoryIds)
        throws DxException;
    
    /**
      * 根据关键字获取搜索产品的列表(向上翻页)
      * @param keyName
      * @param currentEndIndex
      * @param pageCount
      * @param orderByField
      * @param startPrice
      * @param endPrice
      * @param beginStar
      * @return
      * @throws DxException  [参数说明]
      * @return SearchModel [返回类型说明]
      * @exception throws [违例类型] [违例说明]
      * @see [类、类#方法、类#成员]
      */
    SearchModel getProductListUp(String keyName, int currentEndIndex, int pageCount, String orderByField,
        double startPrice, double endPrice, double beginStar,String currencyCode)
        throws DxException;
    
    /**
      * 根据关键字获取产品的列表(查询本地数据库),因为搜索引擎搜索产品的时候不能进行销量排序
      * @param keyName
      * @param StartIndex 起始页数
      * @param pageCount  每页加载条数
      * @param orderByField sort排序类型
      * @param startPrice 起始价格
      * @param endPrice 结束价格
      * @param beginStar 评分等级
      * @return
      * @throws DxException  [参数说明]
      * @return SearchModel [返回类型说明]
      * @exception throws [违例类型] [违例说明]
      * @see [类、类#方法、类#成员]
      */
    SearchModel getProductList(String keyName, int StartIndex, int pageCount, String orderByField, double startPrice,
        double endPrice, double beginStar,String currencyCode)
        throws DxException;
    
    /**
      * 根据类目相应查询条件获取产品的列表
      * @param startIndex 起始页数
      * @param pageCount  每页加载条数
      * @param orderByField sort排序类型
      * @param startPrice 起始价格
      * @param endPrice 结束价格
      * @param beginStar 评分等级
      * @param categoryId 目录ID
      * @return
      * @throws DxException  [参数说明]
      * @return List [返回类型说明]
      * @exception throws [违例类型] [违例说明]
      * @see [类、类#方法、类#成员]
      */
    SearchModel getProductListByCategoryId(int startIndex, int pageCount, String orderByField,
        double startPrice, double endPrice, double beginStar, int categoryId,String currencyCode)
        throws DxException;
    
    /**
     *  根据类目，相应查询类型(如清仓等)查询本地mongodb产品数据集
     * @param startindex M 起始位置
     * @param pageCount M 每页条数
     * @param orderByField O sort排序
      * @param startPrice M 起始价格： 默认为0
      * @param endPrice  M 结束价格：默认为无穷大
      * @param beginStar M 多少评分等级以上 默认为0
      * @param relatedType  M 查询类型
      * @return
      * @throws DxException  [参数说明]
      * @return List [返回类型说明]
      * @exception throws [违例类型] [违例说明]
      * @see [类、类#方法、类#成员]
      */
    ArrayList<ProductModel> getProductListByCategoryIdAndRelatedType(int startindex, int pageCount,
        String orderByField, double startPrice, double endPrice, double beginStar, String relatedType)
        throws DxException;
    
    /**
     *  根据类目，相应查询类型(如清仓等)查询本地mongodb产品数据集
     * @param startindex M 起始位置
     * @param pageCount M 每页条数
     * @param orderByField O sort排序
      * @param startPrice M 起始价格： 默认为0
      * @param endPrice  M 结束价格：默认为无穷大
      * @param beginStar M 多少评分等级以上 默认为0
      * @param relatedType  M 查询类型
      * @param isLoadFromCache  M 是否支持缓存读取
      * @return
      * @throws DxException  [参数说明]
      * @return List [返回类型说明]
      * @exception throws [违例类型] [违例说明]
      * @see [类、类#方法、类#成员]
      */
    ArrayList<ProductModel> getProductListByCategoryIdAndRelatedType(int startindex, int pageCount,
        String orderByField, double startPrice, double endPrice, double beginStar, String relatedType,
        boolean isLoadFromCache)
        throws DxException;
    
    /**
      * 根据类目，相应查询类型(如清仓)，查询条件查询产品总个数和星级分布情况
      * @param startPrice
      * @param endPrice
      * @param beginStar
      * @param categoryId
      * @param relatedType
      * @return
      * @throws DxException  [参数说明]
      * @return ProductResultModel [返回类型说明]
      * @exception throws [违例类型] [违例说明]
      * @see [类、类#方法、类#成员]
      */
    ProductResultModel getProductResultByCategoryRelatedType(double startPrice, double endPrice, double beginStar,
        String categoryId, String relatedType)
        throws DxException;
    
    /**
      * 根据查询条件查询产品总个数和星级分布情况
      * @param keyName
      * @param startPrice
      * @param endPrice
      * @param beginStar
      * @param categoryId
      * @param relatedType
      * @return
      * @throws DxException  [参数说明]
      * @return ProductResultModel [返回类型说明]
      * @exception throws [违例类型] [违例说明]
      * @see [类、类#方法、类#成员]
      */
    ProductResultModel getProductResult(String keyName, double startPrice, double endPrice, double beginStar,
        String categoryId, String relatedType)
        throws DxException;
    
    /**
      *  获取某一商品用户上传的图片列表
      * @param sku M
      * @param CICID M
      * @param userName M
      * @param pageIndex O
      * @param pageSize O
      * @return  [参数说明]
      * @return String [返回类型说明]
      * @exception throws [违例类型] [违例说明]
      * @see [类、类#方法、类#成员]
      */
    ArrayList<CustomerPhotosModel> getCustomerPhotoList(int sku, long CICID, String userName, int pageIndex,
        int pageSize,String token)
        throws DxException;
    
    /**
      *  获取商品详情信息。消息字段请看下面的成功示例
      * @param sku
      * @return  [参数说明]
      * @return String [返回类型说明]
      * @exception throws [违例类型] [违例说明]
      * @see [类、类#方法、类#成员]
      */
    ProductModel getProductDetail(int sku,String currencyCode)
        throws DxException;
    
    /**
      *  获取商品的用户评论列表
      * @param sku
      * @param CICID 默认为空 "" 而非原先的"0" 
      * @param username
      * @param pageindex
      * @param pagesize
      * @return
      * @throws DxException  [参数说明]
      * @return List [返回类型说明]
      * @exception throws [违例类型] [违例说明]
      * @see [类、类#方法、类#成员]
      */
    ArrayList<ReviewlistModel> getCusotmerReviewList(int sku, String CICID, String username, int pageindex, int pagesize,String token)
        throws DxException;
    
    /**
      * 库存量上限
      * @param sku
      * @return
      * @throws DxException  [参数说明]
      * @return Map<Integer,String> [返回类型说明]
      * @exception throws [违例类型] [违例说明]
      * @see [类、类#方法、类#成员]
      */
    Map<Integer, SalesLimitModel> getSaleslimit(ArrayList<Integer> sku)
        throws DxException;
    
    /**
     * TopSellers
     * @param sku
     * @return
     * @throws DxException  [参数说明]
     * @return Map<Integer,String> [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    /*ArrayList<ProductModel> getTopSellersList(int pageindex, int pagesize)
        throws DxException;
    
    *//**
     * MvProducts
     * @param sku
     * @return
     * @throws DxException  [参数说明]
     * @return Map<Integer,String> [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     *//*
    ArrayList<ProductModel> getMvProductsList(int pageindex, int pagesize)
        throws DxException;
    
    *//**
     * NewArrivals
     * @param sku
     * @return
     * @throws DxException  [参数说明]
     * @return Map<Integer,String> [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     *//*
    ArrayList<ProductModel> getNewArrivalsList(int pageindex, int pagesize)
        throws DxException;
    
    *//**
     * LatestDiscounts
     * @param sku
     * @return
     * @throws DxException  [参数说明]
     * @return Map<Integer,String> [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     *//*
    ArrayList<ProductModel> getLatestDiscountsList(int pageindex, int pagesize)
        throws DxException;
    
    *//**
     * Spotlights
     * @param sku
     * @return
     * @throws DxException  [参数说明]
     * @return Map<Integer,String> [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     *//*
    ArrayList<ProductModel> getSpotlights(int pageindex, int pagesize)
        throws DxException;
    */
    /**
     * 首页按钮统一请求接口
     * @param pageindex 页码
     * @param pagesize 每页大小
     * @param type 按钮类型
     * @return
     * @throws DxException
     */
    SearchModel getHomeBtnDataList(long customerID,boolean isFilter,String categoryIds,int pageindex, int pagesize,String type,String orderByField)
        throws DxException;
    
    /**
     * @创建：Tony 2016-4-14下午4:46:34
     * @描述：获取Banner产品列表
     * @param activeType 活动类型
     * @param activeID   活动ID
     * @param startIndex 页码
     * @param pageSize   每页数据大小
     * @param orderbyField 排序方式
     * @param customerID 用户ID
     * @param isFilter   是否过滤
     * @param categoryIds 白名单
     * @return
     * @throws DxException
     */
    ArrayList<ProductModel> getActiveProduct(int activeType,String activeID,int startIndex,int pageSize,
    		String orderbyField,long customerID,boolean isFilter,String categoryIds)throws DxException;;
}
